1장. 단어를 숫자로 — 선형대수
출처: 『AI 엔지니어링 선수지식』(youtubedu 자체 제작 학습노트) | 입문판 재구성 — 노트가 1차 소스(PDF 원본 없음)
코드는 분위기만 — numpy·import 같은 말은 몰라도 됩니다. 비유와 직접 해보기 숫자만 따라와도 충분해요.
0. 이 장의 새 단어 (0장에 없는 것만 3개)
0장 용어집에 이미 있는 말(벡터·행렬·차원·임베딩·내적·코사인 유사도)은 다시 설명하지 않아요.
이 장에서 처음 나오는 말은 딱 3개입니다.
길이(norm, 노름)
한 문장 뜻 — 벡터라는 화살표가 얼마나 긴가를 나타내는 하나의 숫자.
일상비유 — 자로 잰 화살표의 길이. 방향은 빼고 "얼마나 멀리 가나"만 본다.
한 줄 예 —
# [3, 4] 의 길이 = 5 (각 숫자 제곱해 더한 뒤 루트)
length = (3**2 + 4**2) ** 0.5 # 5.0
행렬 곱(matrix multiplication)
한 문장 뜻 — 표(행렬)와 표를 곱해 새로운 표로 바꾸는 연산. 내적을 칸마다 여러 번 한 것.
일상비유 — 입력을 넣으면 모양이 바뀌어 나오는 변환 기계. 기계는 고정, 재료만 바꿔 넣는다.
한 줄 예 —
# 표 A 와 표 B 를 곱하면 새 표가 나온다
result = A @ B # @ 가 곱하기 기호
고유벡터·고유값(eigenvector·eigenvalue)
한 문장 뜻 — 어떤 변환을 해도 방향이 안 바뀌는 특별한 화살표가 고유벡터, 그때 늘어난 배율이 고유값.
일상비유 — 빙글 도는 지구본의 남극–북극 축. 다른 점은 다 도는데 이 축만 자리를 안 바꾼다.
한 줄 예 —
# [[2,0],[0,3]] 을 [1,0] 에 곱하면 [2,0]. 방향 그대로, 길이만 2배
# → [1,0] 이 고유벡터, 2 가 고유값
(귀납 도입) 이런 적 있죠?
컴퓨터에게 "강아지" 라고 쳤더니 받아먹질 못합니다.
당연해요. 컴퓨터는 글자를 모릅니다. 숫자만 알아요.
그러면 단어를 숫자로 바꿔야 하는데, 숫자 하나로는 부족합니다.
"강아지" 한 단어에도 뜻이 여러 갈래라서, 숫자 한 개로는 다 담기지 않아요.
그래서 숫자를 여러 개 한 줄로 묶습니다. 이 묶음이 벡터예요.
그리고 이 묶음들을 다루고, 쌓고, 비교하고, 변환하는 모든 계산이 선형대수입니다.
한 장면으로 — LLM 이 "강아지" 를 알아듣는 첫걸음은, 그 단어를 수백 개의 숫자 묶음으로 바꾸는 일이에요.
이 장은 그 숫자 묶음을 다루는 6가지 도구를 하나씩 풀어 봅니다.
이 장에서 딱 6가지만
- 벡터 — 단어 하나를 숫자 묶음으로 적은 것. (화살표 = 방향 + 크기)
- 행렬 — 그 벡터를 여러 줄 쌓은 숫자 표. (엑셀 시트)
- 내적 — 두 벡터가 얼마나 같은 방향인지를 숫자 하나로 잰 점수.
- 코사인 유사도 — 크기는 빼고 방향(각도)만으로 비슷함을 잰 값.
- 행렬 곱 — 표를 표로 바꾸는 변환. 신경망의 모든 층이 이거.
- 고유값·고유벡터 — 변환해도 방향이 안 바뀌는 특별한 화살표.
한 줄 요약 — LLM 은 글자를 벡터로 바꾸고, 행렬 곱으로 섞고, 내적으로 서로 주목하게 만드는 거대한 선형대수 계산기예요.
1. 벡터 — 숫자 묶음
막히는 장면
친구 한 명을 컴퓨터에게 소개하고 싶어요.
"키 크고 마른 편" 이라고 적으면 컴퓨터는 못 알아듣습니다.
대신 [키 172, 몸무게 65, 시력 1.2] 처럼 숫자로 적으면, 컴퓨터가 받아먹어요.
이 숫자 묶음 한 장이 바로 그 친구의 벡터입니다.
비유 먼저 — 화살표
"북동쪽으로 5km" 라는 말에는 방향(북동)과 크기(5km)가 같이 들어 있어요.
벡터가 정확히 이래요. [3, 4] 는 오른쪽으로 3, 위로 4 간 화살표입니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 북동쪽으로 5km (방향+크기) | v = [3, 4] |
숫자로 안 바꾸면 컴퓨터가 못 읽음 |
| 친구 정보 카드 (항목별 숫자) | friend = [172, 65, 1.2] |
차원(숫자 개수)이 안 맞으면 비교가 막힘 |
한 문장 정의 — 벡터는 여러 숫자를 순서대로 묶은 묶음이며, 방향과 크기를 함께 담는다.
예시 폭격
예시 1 (완성예 — 길이 구하기) — [3, 4] 의 길이는 각 숫자를 제곱해 더하고(3²+4²=25) 루트를 씌워 √25 = 5 입니다. (피타고라스 정리)
예시 2 (부분완성 — 빈칸) — [6, 8] 의 길이는? 6²+8² = 36+64 = 100, 루트 씌우면 √100 = ___ 입니다. (답: 10. 방향은 [3,4] 와 같고 길이만 2배예요.)
예시 3 (독립적용 — 실생활) — 넷플릭스는 사용자를 [액션 80, 로맨스 30, 코미디 50], 영화를 [액션 90, 로맨스 5, 코미디 20] 으로 저장해요. 두 벡터의 방향이 비슷하면 그 영화를 추천합니다.
import numpy as np
v = np.array([3, 4])
print(np.linalg.norm(v)) # 5.0 (길이)
print(v / np.linalg.norm(v)) # [0.6 0.8] (길이를 1로 맞춘 화살표)
y
4 | ● (3,4)
3 | /:
| / : ← 길이 = √(3²+4²) = 5
0 +----+---+--- x
0 3
미니 시나리오 — 쿠팡·유튜브·스포티파이의 "추천" 은 전부 사용자와 상품을 벡터로 저장해 두고, 방향이 가까운 것을 찾는 일이에요. LLM 은 한 발 더 나아가 "강아지" 같은 단어를 수백~수천 개 숫자 묶음(임베딩)으로 바꿔, 뜻이 비슷한 단어를 가까이 모아 둡니다.
2. 행렬 — 숫자 표
막히는 장면
친구 한 명은 벡터 한 줄로 적었어요.
그런데 반 학생 30명을 한꺼번에 다루려면?
벡터 30개를 위아래로 쌓으면 됩니다. 이렇게 쌓인 숫자 표가 행렬이에요.
비유 먼저 — 엑셀 시트
학생 30명의 [국어, 영어, 수학] 점수를 적으면 30줄 × 3칸 표가 됩니다.
한 줄(행)이 한 학생의 점수 벡터예요. 행렬은 곧 벡터의 묶음입니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 엑셀 시트 (행 × 열) | M = [[90, 85, 100], [70, 95, 80]] |
행과 열을 헷갈리면 엉뚱한 칸을 읽음 |
| 흑백 사진 (칸마다 밝기) | 사진 = 1080행 × 1920열 |
모양(shape)을 잘못 읽으면 계산이 막힘 |
한 문장 정의 — 행렬은 벡터를 여러 줄 쌓아 만든 숫자 표(행 × 열 격자)다.
예시 폭격
예시 1 (완성예 — 모양 읽기) — [[90, 85, 100], [70, 95, 80]] 은 줄(행)이 2개, 칸(열)이 3개라서 모양은 (2, 3) 입니다. "2명 × 3과목" 이라는 뜻이에요.
예시 2 (부분완성 — 빈칸) — [[1, 2], [3, 4], [5, 6]] 의 모양은? 줄이 3개, 칸이 2개니까 (, ) 입니다. (답: (3, 2))
예시 3 (독립적용 — 좌석표) — 영화관 좌석을 행(A~J) × 열(1~20) 표로 만들고 예매=1·빈자리=0 을 채우면, "몇 자리 남았나" 는 0 의 개수가 됩니다.
M = np.array([[90, 85, 100], [70, 95, 80]])
print(M.shape) # (2, 3) ← 2줄 3칸
print(M[:, 2]) # [100 80] ← 수학 점수 열만 뽑기
미니 시나리오 — 이미지(픽셀 표)·표 데이터·문장(단어 벡터 쌓기)이 전부 행렬이에요. 문장 "나는 학교에 간다" 는 단어 4개 × 768칸 = 4×768 행렬이 됩니다. 그리고 모델 안의 가중치도 전부 거대한 행렬이에요.
3. 내적 — 같은 방향 점수
막히는 장면
벡터 두 개가 있어요. 이 둘이 얼마나 비슷한지 숫자 하나로 알고 싶습니다.
그냥 눈으로 보면 헷갈려요. 객관적인 점수가 필요해요.
같은 자리끼리 곱해 다 더하면, 방향이 비슷할수록 큰 숫자가 나옵니다. 이게 내적이에요.
비유 먼저 — 취향 궁합
나 [액션5, 로맨스1, 코미디4] 와 친구 [액션4, 로맨스2, 코미디5].
둘 다 액션·코미디가 높아서, 같은 자리끼리 곱한 값이 커져요 = 궁합이 좋다는 뜻입니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 취향 궁합 점수 | np.dot(a, b) |
값이 클수록 같은 방향, 0 이면 직각(무관) |
| 손전등과 벽 | a @ b (@ 도 내적) |
차원 수가 다르면 곱할 수가 없음 |
손전등을 벽에 정면으로 비추면 밝고(내적 큼), 비스듬하면 어둡고(작음), 90도 옆이면 안 닿아요(내적 0).
한 문장 정의 — 내적은 두 벡터를 같은 자리끼리 곱해 모두 더한 하나의 숫자이며, 두 벡터가 얼마나 같은 방향인가를 나타낸다.
예시 폭격
예시 1 (완성예) — [5, 1, 4] · [4, 2, 5] = (5×4)+(1×2)+(4×5) = 20+2+20 = 42 입니다.
예시 2 (부분완성 — 빈칸) — [2, 3] · [4, 1] = (2×4)+(3×1) = 8+3 = ___ 입니다. (답: 11)
예시 3 (독립적용 — 검색 엔진) — 검색 엔진은 "검색어 벡터 · 문서 벡터" 의 내적으로 관련도 점수를 매깁니다. 값이 클수록 검색 결과 위에 보여요.
a = np.array([5, 1, 4]); b = np.array([4, 2, 5])
print(np.dot(a, b)) # 42
print(a @ b) # 42 (@ 도 같은 내적)
미니 시나리오 — LLM 의 어텐션(attention)이라는 핵심 기능이 바로 내적이에요. "이 단어가 저 단어에 얼마나 주목하나" 를 두 단어 벡터의 내적으로 계산합니다. 내적을 알면 어텐션도 그냥 곱하고 더하기예요.
4. 코사인 유사도 — 방향만 보기
막히는 장면
내적은 좋은데, 한 가지 문제가 있어요.
긴 문서일수록 숫자가 커서, 내용과 상관없이 내적이 무조건 커집니다.
길이 차이 때문에 짧은 문서가 늘 손해를 봐요.
그래서 길이를 빼고 방향(각도)만 비교하면 공정해집니다. 이게 코사인 유사도예요.
비유 먼저 — 같은 곳 보기
두 사람이 같은 방향을 보면 1, 직각(90도)이면 0, 정반대(180도)면 -1.
키가 크든 작든 상관없이, 보는 방향만 봅니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 같은 방향 보기 (각도) | (a @ b) / (norm(a) * norm(b)) |
0 이면 무관, 1 이면 매우 비슷 |
| 길이를 1로 맞춤 | 각 벡터를 자기 길이로 나눔 | 그냥 내적만 쓰면 긴 문서가 무조건 이김 |
한 문장 정의 — 코사인 유사도는 두 벡터의 각도만으로 비슷함을 재는 값(-1~1)이며, 크기는 무시하고 방향만 본다.
예시 폭격
예시 1 (완성예 — 같은 방향) — [1, 0] 과 [2, 0] 은 둘 다 오른쪽을 향해요(각도 0). 길이는 다르지만 방향이 같으니 코사인 = 1 입니다.
예시 2 (부분완성 — 빈칸) — [1, 0] 과 [0, 1] 은 하나는 오른쪽, 하나는 위쪽이라 직각(90도)이에요. 그래서 코사인 = ___ 입니다. (답: 0)
예시 3 (독립적용 — 음악 추천) — 스포티파이 "비슷한 곡" 은 곡마다 분위기 벡터를 만들어 코사인 유사도로 비교해요. 인기곡이든 신곡이든 분위기 방향이 같으면 추천됩니다.
from numpy.linalg import norm
a = np.array([5, 1, 4]); b = np.array([4, 2, 5])
print(round(a @ b / (norm(a) * norm(b)), 3)) # 0.949 (꽤 비슷)
미니 시나리오 — 0장에서 본 RAG(검색 증강 생성) 의 "내 질문과 가장 비슷한 문서 찾기" 가 바로 코사인 유사도예요. 벡터DB(Pinecone·Chroma) 가 수백만 문서 중 방향이 가장 가까운 것을 즉시 찾아 줍니다.
5. 행렬 곱 — 변환 기계
막히는 장면
"한국어 의미 벡터를 영어 의미 벡터로 바꿔라."
숫자를 하나하나 손으로 옮기면 끝이 없어요.
그런데 변환 규칙 전체를 행렬 하나에 적어 두고, 입력에 그 행렬을 곱하면 한 방에 바뀝니다. 이게 행렬 곱이에요.
비유 먼저 — 변환 기계
행렬 곱은 입력을 넣으면 모양이 바뀌어 나오는 기계예요.
기계(행렬)는 고정해 두고, 재료(입력 벡터)를 넣을 때마다 같은 변환이 적용됩니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 변환 기계 | output = A @ B |
답 1개에 행렬 곱이 수천 번 일어남 |
| 칸이 곧 다이얼(가중치) | 가중치 행렬 = 파라미터 |
칸이 수천억 개 → GPU 없으면 너무 느림 |
한 문장 정의 — 행렬 곱은 행렬끼리 곱해 새 표로 변환하는 연산이며, 내적을 칸마다 여러 번 반복하는 것이다.
예시 폭격
예시 1 (완성예 — 한 칸만 보기) — [[1,2],[3,4]] × [[5,6],[7,8]] 의 맨 왼쪽 위 [0,0] 칸은, 첫째 줄 [1,2] 와 첫째 칸 [5,7] 의 내적이에요. (1×5)+(2×7) = 5+14 = 19 입니다.
예시 2 (부분완성 — 빈칸) — 같은 곱에서 [0,1] 칸은 첫째 줄 [1,2] 와 둘째 칸 [6,8] 의 내적이에요. (1×6)+(2×8) = 6+16 = ___ 입니다. (답: 22)
예시 3 (독립적용 — 신경망) — 신경망의 모든 층이 "입력 × 가중치 행렬" 이에요. 답변 1개에 행렬 곱이 수천 번 일어납니다. GPU 가 AI 에 필수인 이유가 바로 이 행렬 곱을 초고속으로 한꺼번에 하기 때문이에요.
A = np.array([[1, 2], [3, 4]]); B = np.array([[5, 6], [7, 8]])
print(A @ B) # [[19 22] [43 50]] ← 칸마다 행과 열의 내적
미니 시나리오 — 대형 모델이 "수천억 개 파라미터" 라는 말은, 곱셈에 쓰이는 행렬 칸이 수천억 개라는 뜻이에요. 0장 비유로는 라디오 다이얼 수천억 개를 조금씩 돌려 답을 맞춰 가는 셈입니다.
6. 고유값·고유벡터 — 안 변하는 화살표
막히는 장면
행렬은 보통 화살표를 늘리고 방향까지 비틀어요.
그런데 어떤 변환을 해도 방향이 안 바뀌는 특별한 화살표가 있습니다.
그 화살표가 고유벡터, 그때 늘어난 배율이 고유값이에요. 변환의 본질적 방향을 알려 줍니다.
비유 먼저 — 도는 지구본의 축
빙글 도는 지구본에서, 남극–북극 축만 자리를 안 바꿔요.
다른 점은 모두 돕니다. 그 축이 고유벡터예요. 변환의 중심 방향을 짚어 줍니다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 지구본의 남극–북극 축 | vals, _ = np.linalg.eig(A) |
방향이 안 바뀌는 벡터만 고유벡터 |
| 늘어난 배율 = 고유값 | [1,0] → [2,0] 이면 고유값 2 |
직관 없이 외우면 금방 헷갈림 |
한 문장 정의 — 고유벡터는 어떤 변환을 적용해도 방향이 안 바뀌는 특별한 화살표이고, 고유값은 그때 늘어난 배율이다.
예시 폭격
예시 1 (완성예) — [[2,0],[0,3]] 를 [1,0] 에 곱하면 [2,0] 이 됩니다. 방향은 그대로(오른쪽), 길이만 2배예요. 그래서 [1,0] 은 고유벡터, 2 는 고유값입니다.
예시 2 (부분완성 — 빈칸) — 같은 행렬 [[2,0],[0,3]] 를 [0,1] 에 곱하면 [0,3] 이에요. 방향(위쪽)은 그대로고 길이만 3배. 그래서 고유값은 ___ 입니다. (답: 3)
예시 3 (독립적용 — 페이지랭크) — 초창기 구글의 페이지랭크는 거대한 링크 행렬의 고유벡터를 계산하는 일이었어요. 데이터의 핵심 축을 뽑아내는 도구입니다.
A = np.array([[2, 0], [0, 3]])
vals, _ = np.linalg.eig(A)
print(vals) # [2. 3.] (고유값 두 개)
미니 시나리오 — 고유값·고유벡터는 데이터에서 가장 중요한 방향을 골라내 차원을 줄이는 일(PCA) 에 쓰여요. 회전 직관과도 닿아 있어, 이걸 알아 두면 나중에 임베딩을 분석할 때 훨씬 수월합니다.
정리 — 단순 규칙
이 장의 6가지는 따로따로가 아니라 한 줄로 이어져요.
| 도구 | LLM 에서 하는 일 |
|---|---|
| 벡터 | 단어·문장의 의미를 숫자로 (임베딩) |
| 행렬 | 문장 전체·모델 가중치 |
| 내적 | 단어 간 주목도 (어텐션 점수) |
| 코사인 유사도 | 비슷한 문서 검색 (RAG·벡터DB) |
| 행렬 곱 | 신경망 모든 층 (GPU 가속 대상) |
| 고유값 | 핵심 축 뽑기 (차원 축소) |
기억할 단순 규칙 세 줄 —
첫째, AI 가 다루는 모든 것은 결국 숫자 묶음(벡터·행렬)이다.
둘째, 비슷함은 글자가 아니라 방향(내적·코사인)으로 잰다.
셋째, 변환은 표 곱하기(행렬 곱) 한 방으로 끝낸다.
한 문장으로 — LLM 은 글자를 벡터로 바꾸고(임베딩), 행렬 곱으로 섞고, 내적으로 서로 주목하게(어텐션) 만드는 거대한 선형대수 계산기예요.
한 걸음 더 ▸ (지금 몰라도 됨) — 3차원까지는 우리가 그림으로 그릴 수 있지만, 컴퓨터는 768차원·4096차원도 똑같은 방식으로 다뤄요. "그림이 안 그려진다" 고 겁먹을 필요 없어요. 계산 규칙은 차원이 몇이든 똑같습니다. 더 깊이 보고 싶으면 3Blue1Brown 선형대수 시리즈(한국어 자막)와 Khan Academy Linear Algebra 가 강력 추천입니다.
다음 장 예고 — 다음 장에서는 "고칠 방향 찾기" 인 미적분으로 넘어가요. 모델이 틀렸을 때 어느 쪽으로 고쳐야 덜 틀리는지를 계산으로 찾습니다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)
클릭하거나 Space를 눌러 뒤집기